cities = {'CA' => 'San Francisco',
  'MI' => 'Detroit',
  'FL' => 'Jacksonville'}

cities ['NY'] = 'New York'
cities ['OR'] = 'Portland'
#简单定义cities包含的一些值
#什么叫包含一些值？ 包含的是什么值？ 说明你根本就没搞清楚用大括号是干什么的， 也没搞清楚map是个什么东西

def find_city(map, state)
  if map.include? state
    return map[state]
  else
    return "Not found."
  end
end
#定义find_city，如果map里面接受state的值，就输出map【state 】
#第一， 不是什么接受， include是包含的意思， 麻烦你不清楚这个单词的意思就查一下， 
#第二， 我不清楚你到底是出于一种什么想法， 就一定要整一个输出出来， 这哪里有输出？ 什么叫输出？ 这就是方法要返回一个值， 这叫返回， return， 这个单词跟输出有什么关系？？？？？？？？
#例如state = CA map.include?state 就为真值，return map[state]就会执行CA的返回值San Francisco
cities[:find] = method(:find_city)
#将cities里的数组值取等于find_city方法
#这个地方的内容如果深入的讲就比较深， 但这个地方要讲的是：
#1. method(:find_city)， 这是在调用一个叫method的方法（method），这个方法会在当前的上下文（context）里寻找一个叫find_city的方法， 然后返回这个方法的引用（reference）
#2. ruby的map里可以存放任何东西， 当然也可以存放一个方法的引用， 存放进去之后， 在后面就可以拿出来， 怎么拿？因为你是map[:find]=method(:find_city)这样放进去的， 那map[:find]就可以拿到了了，
#3. 有一个方法的引用， 怎么去调用这个引用指向的方法？ 要用到call这个方法了， 所以后面会cities[:find].call(cities, state)， 这其实就是在以另一种方式在调用前面的find_city方法

#如果去理解一个方法的引用？ 你可以想像， 在ruby解释这个程序时， 因为你前面定义了一个方法， 内存中就会有个地方存放了这个方法， 因为你的方法名叫find_city， ruby的解释器可以根据你的方法名是找到这个方法， 你可以想像有某个符号（symbol）来代表这个方法， 你通过这个符号就可以找到这个方法， :find_city就是一个符号， 任何一个方法， 比如def say_hello ...... end， 也可以通过符号:say_hello 来找到这个方法， 那这个时候， 通过method(:find_city)， 就可以拿到这个方法在内存中的位置了， 然后就把这个位置存放在cities中， 下面再来取出这个位置， 拿到这个方法在内存中的位置， 就可以调用， 这就是通过call来完成的， 这里面有些东西， 可能你暂时还不能完全理解， 也很正常， 这涉及到动态语言的一些比较高级的特征， 暂时不理解也没有关系， 先可以把这部分内容记着， 或者做好笔记， 以备以后参考， 这个还是挺有用的。 
while true
  print "State?(ENTER to quit)"
  state = gets.chomp

  break if state.empty?

  puts cities [:find] .call(cities,state)
end
# state输入为cities里的值时执行cities[:find].call(cities,state)里面call的用法，指定参数的调用，返回到方法的返回值
# 通过你的描述， 也大概你对这一连串的调用不是特别理解， 但要记住有这么回个事， 平时也要想一想这个问题， 尝试着怎么去理解它
